/**
 * bind() 方法创建一个新的函数， 当这个新函数被调用时其this置为提供的值，
 * 其参数列表前几项置为创建时指定的参数序列。
 * fun.bind(thisArg[, arg1[, arg2[, ...]]])
 * 
 * 改变原函数的 this 指向，即绑定上下文，返回原函数的拷贝
 * 当绑定函数 被调用时，bind的额外参数将置于实参之前传递给被绑定的方法。
 * 注意:一个 绑定函数 也能使用 new 操作符创建对象,这种行为就像把原函数当成构造器，
      thisArg 参数无效。也就是 new 操作符修改 this 指向的优先级更高

 */
Function.prototype.myBind = function (context,...outerArgs) {
  // this————bar
  let fn = this
  console.log(this);
  return fn.apply(context,[...outerArgs])
}


this.value = 2
let foo = {
 value: 1
};
let bar = function(name, age, school){
 console.log(name) // 'An'
 console.log(age) // 22
 console.log(school) // '家里蹲大学'
}
console.log(bar.myBind(foo, 'An'));
// let temp = bar.myBind(foo, 'An') //预置了部分参数'An'
// temp(22, '家里蹲大学') //这个参数会和预置的参数合并到一起放入bar中